package designpatterns.behavior;

/**
 * 模板模式：一些方法通用，却在每一个子类都重新写了这一方法。
 * 优点：1、它封装了不变部分，扩展可变部分。它把认为是不变部分的算法封装到父类中实现，而把可变部分算法由子类继承实现，
 * 便于子类继续扩展。
 * 2、它在父类中提取了公共的部分代码，便于代码复用。
 * 3、部分方法是由子类实现的，因此子类可以通过扩展方式增加相应的功能，符合开闭原则。
 * 缺点：1、对每个不同的实现都需要定义一个子类，这会导致类的个数增加，系统更加庞大，设计也更加抽象。
 * 2、父类中的抽象方法由子类实现，子类执行的结果会影响父类的结果，这导致一种反向的控制结构，它提高了代码阅读的难度。
 *
 * @author jack.wu
 * @since 2019/10/29 16:55
 */
public class Template {

    public static void main(String[] args) {
        Football football = new Football();
        football.play();
    }

}

abstract class AbstractGame {

    /**
     * 初始化
     */
    abstract void initialize();

    /**
     * 开始游戏
     */
    abstract void startPlay();

    /**
     * 结束游戏
     */
    abstract void endPlay();

    /**
     * 模板
     */
    public final void play() {

        initialize();
        startPlay();
        endPlay();
    }

}

class Football extends AbstractGame {

    @Override
    void initialize() {
        System.out.println("Football Game Initialize");
    }

    @Override
    void startPlay() {
        System.out.println("Football Came Start");
    }

    @Override
    void endPlay() {
        System.out.println("Football Came End");
    }
}
